package com.yjzx.core.intercept;


import com.yjzx.core.bean.ConfigurationInfo;
import com.yjzx.core.bean.DataInfo;
import com.yjzx.core.bean.TemplatePath;
import com.yjzx.core.engine.CustomEngine;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author guozhi
 * @date 2023/10/18
 * @description 自定义拦截接口
 */
public interface CustomIntercept {


    /**
     * 获取配置
     *
     * @return
     */
    ConfigurationInfo getConfigurationInfo();

    /**
     * 获取数据
     * @return
     */
    DataInfo getDataInfo();

    /***
     * 自定义Handle 接口 -> 程序将会自动拦截实现了CustomHandle接口的类, 统一调用 handle方法
     * CustomEngine.execute 方法直接使用
     */
    default void handle(){
        // 获取模板构造器
        Configuration configuration = CustomEngine.getConfiguration();

        Map<String, Object> params = new HashMap<>(8);
        params.put("config", configuration);
        params.put("dataInfo", getDataInfo());

        List<TemplatePath> list = getConfigurationInfo().getTemplates();

        list.forEach(templatePath -> {
            String filePath = templatePath.getFilePath();
            // 构建文件路径
            File file = new File(filePath);
            file.getParentFile().mkdirs();
            // 基于模板, 写入至文件之中
            try (Writer writer = new FileWriter(filePath)) {
                Template template = configuration.getTemplate(templatePath.getTemplatePath());
                template.process(params, writer);
                writer.flush();
            } catch (IOException | TemplateException e) {
                e.printStackTrace();
            }

        });
    }

}
